본문으로 건너뛰기

03-080. 데이터 정규화, 표준화

데이터 정규화, 표준화

데이터 정규화와 표준화는 서로 다른 범위와 단위를 가진 데이터를 비교 가능한 형태로 변환하는 과정이다. 특히 머신러닝 모델에서는 필수적인 전처리 단계다.

정규화 - Normalization

정규화는 데이터의 구간을 맞추는 것이다. 보통 0과 1 사이의 값으로 변환하는 것을 말한다. 정규화는 범위가 서로 다른 값을 비교할 때 유용하며 그 외에 여러 수하적인 처리에 유용하기 때문에 많이 한다. 많은 방법이 있지만 Min-Max 정규화가 가장 일반적이다.

Min-Max 정규화 공식

정규화된 값 = (원본값 - 최솟값) / (최댓값 - 최솟값)
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import numpy as np

# 샘플 데이터
data = {
'나이': [25, 30, 35, 40, 45, 50, 55, 60],
'연봉': [3000, 3500, 4000, 4500, 5000, 5500, 6000, 6500]
}
df = pd.DataFrame(data)
print("원본 데이터:")
print(df)

# Min-Max 정규화
scaler = MinMaxScaler()
df[['나이', '연봉']] = scaler.fit_transform(df[['나이', '연봉']])

# 수동으로 정규화
df['나이_정규화'] = (df['나이'] - df['나이'].min()) / (df['나이'].max() - df['나이'].min())

파이썬의 sklearn에 MinMaxScaler가 있으므로 그것을 사용해도 된다. Min-Max 코드가 복잡하지 않으므로 직접 작성해도 된다. AI를 이용해 다음과 같이 코드를 생성해보자.

💻참고 프롬프트: Python에서 Min-Max 정규화하는 함수를 만들어주세요.

표준화 - Standardization

표준화는 데이터를 평균이 0, 표준편차가 1인 분포로 변환하는 방법이다. Z-score 표준화라고도 한다. 통계과 데이터 과학에서 많이 사용한다. 초급 단계에서는 이런 것이 있다는 것만 알아두자. 용도는 다음과 같다.

서로 다른 단위의 변수 비교 가능

  • 나이(20-60세)와 연봉(2000-8000만원)처럼 단위와 범위가 다른 변수들을 동일한 기준으로 비교할 수 있다
  • 각 변수가 분석에 미치는 영향을 공정하게 평가할 수 있다

이상치에 상대적으로 강함

  • 정규화와 달리 극값(최댓값, 최솟값)에 의존하지 않아 이상치의 영향을 덜 받는다
  • 데이터의 전체적인 분포 특성을 유지한다

통계적 해석 용이

  • 표준화된 값은 원래 분포에서 평균으로부터 몇 표준편차 떨어져 있는지를 나타낸다
  • Z-score가 2 이상이면 상위 2.5% 이내, -2 이하면 하위 2.5% 이내에 해당한다

머신러닝 알고리즘 성능 향상

  • 경사하강법 기반 알고리즘에서 수렴 속도가 빨라진다
  • 가중치 업데이트가 안정적으로 이루어진다
  • 특히 선형 회귀, 로지스틱 회귀, SVM 등에서 필수적이다

표준화 공식

원래값에서 평균을 뺀 편차를 표준편차로 나누면 된다.

표준화된 값 = (원본값 - 평균) / 표준편차

코드

from sklearn.preprocessing import StandardScaler

# 표준화
scaler = StandardScaler()
df[['나이', '연봉']] = scaler.fit_transform(df[['나이', '연봉']])

# 수동으로 표준화
df['나이_표준화'] = (df['나이'] - df['나이'].mean()) / df['나이'].std()

정규화 vs 표준화 선택 기준

  • 정규화 사용 시기

    • 데이터가 균등 분포를 따를 때
    • 최댓값과 최솟값이 명확할 때
    • 신경망, KNN 알고리즘 사용 시
  • 표준화 사용 시기

    • 데이터가 정규분포를 따를 때
    • 이상치가 많을 때
    • 선형 회귀, SVM 알고리즘 사용 시

로그 변환

데이터가 심하게 치우쳐 있을 때 로그 변환을 사용하여 분포를 정규분포에 가깝게 만들 수 있다.

import numpy as np

# 로그 변환 (자연로그)
df['연봉_로그'] = np.log(df['연봉'])

# 로그 변환 (상용로그)
df['연봉_로그10'] = np.log10(df['연봉'])

# 0이나 음수가 있는 경우 (log1p 사용)
df['연봉_로그1p'] = np.log1p(df['연봉'])

데이터 정제와 표준화 실습 예제

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler

# 예제 데이터 생성
data = {
'고객명': [' 김철수 ', 'LEE YOUNG HEE', '박민수', ' 정수진', 'CHOI JI WOO '],
'나이': [25, 35, 28, 42, 31],
'연봉': [3500, 5200, 4100, 6800, 4900],
'이메일': ['KIM@gmail.com', 'lee@NAVER.com', 'park@gmail.COM', 'jung@naver.com', 'choi@GMAIL.com']
}

df = pd.DataFrame(data)
print("원본 데이터:")
print(df)

# 1. 공백 제거
df['고객명'] = df['고객명'].str.strip()

# 2. 대소문자 통일
df['이메일'] = df['이메일'].str.lower()

# 3. 정규화
scaler_minmax = MinMaxScaler()
df[['나이_정규화', '연봉_정규화']] = scaler_minmax.fit_transform(df[['나이', '연봉']])

# 4. 표준화
scaler_standard = StandardScaler()
df[['나이_표준화', '연봉_표준화']] = scaler_standard.fit_transform(df[['나이', '연봉']])

print("\n정제 및 표준화 후:")
print(df)

데이터 정제와 표준화는 데이터 분석의 품질을 결정하는 중요한 단계다. 각 데이터의 특성에 맞는 적절한 방법을 선택하여 처리해야 한다.

마무리

데이터 정규화와 표준화와 특징과 주요내용을 정리하면 다음과 같다.

정규화(Normalization)

  • 데이터를 0~1 범위로 변환
  • 최댓값과 최솟값의 영향을 받음
  • 이상치에 민감함
  • 신경망, KNN 등에 적합

표준화(Standardization)

  • 평균 0, 표준편차 1로 변환
  • 이상치에 상대적으로 덜 민감
  • 정규분포를 가정
  • 선형회귀, SVM 등에 적합

로그 변환

  • 왜도가 큰 데이터의 분포 개선
  • 곱셈 관계를 덧셈 관계로 변환
  • 0이나 음수 처리에 주의 필요